/**
 * 深克隆
 * @param {} obj
 * @returns
 */
export const deepClone = (value) => {
  // 处理原始值（数字、字符串、布尔值、null、undefined、Symbol）
  if (typeof value !== 'object' || value === null) {
    return value;
  }

  // 处理日期对象
  if (value instanceof Date) {
    return new Date(value.getTime());
  }

  // 处理正则表达式
  if (value instanceof RegExp) {
    return new RegExp(value);
  }

  // 处理 Set
  if (value instanceof Set) {
    const clone = new Set();
    value.forEach((item) => clone.add(deepClone(item)));
    return clone;
  }

  // 处理 Map
  if (value instanceof Map) {
    const clone = new Map();
    value.forEach((v, k) => clone.set(k, deepClone(v)));
    return clone;
  }

  // 处理普通对象和数组
  const isArray = Array.isArray(value);
  const clone = isArray ? [] : {};

  // 处理对象/数组的 Symbol 类型键
  const symbolKeys = Object.getOwnPropertySymbols(value);
  for (const symbolKey of symbolKeys) {
    clone[symbolKey] = deepClone(value[symbolKey]);
  }

  // 处理对象/数组的字符串类型键
  for (const key in value) {
    if (value.hasOwnProperty(key)) {
      clone[key] = deepClone(value[key]);
    }
  }

  return clone;
};

export const generateUniqueId = () => {
  // 获取当前时间戳（毫秒级）
  const timestamp = Date.now();

  // 生成一个4位随机数作为后缀
  const randomPart = Math.floor(Math.random() * 10000)
    .toString()
    .padStart(4, '0');

  // 组合时间戳和随机数
  return `${timestamp}-${randomPart}`;
};

/**
 * 获取当前时间（根据时区）
 * @returns YYYY-MM-DD HH:MM:SS
 */
export const getCurrentTime = () => {
  const now = new Date();

  // 使用 Intl.DateTimeFormat 格式化日期部分
  const dateFormatter = new Intl.DateTimeFormat('zh-CN', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
  });

  // 使用 Intl.DateTimeFormat 格式化时间部分（包含秒）
  const timeFormatter = new Intl.DateTimeFormat('zh-CN', {
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: false, // 使用 24 小时制
  });

  // 分别获取格式化后的日期和时间部分
  const [{ value: year }, , { value: month }, , { value: day }] =
    dateFormatter.formatToParts(now);

  const [{ value: hour }, , { value: minute }, , { value: second }] =
    timeFormatter.formatToParts(now);

  // 组合成最终的格式：YYYY-MM-DD HH:MM:SS
  return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
};
